package com.jeeplus.test.sysTemplate.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jeeplus.sys.service.OfficeService;
import com.jeeplus.sys.service.dto.OfficeDTO;
import com.jeeplus.sys.service.mapstruct.OfficeWrapper;
import com.jeeplus.test.jlnu.xlsxManage.domain.entity.JlnuXlsxManage;
import com.jeeplus.test.jlnu.xlsxManage.mapper.JlnuXlsxManageMapper;
import com.jeeplus.test.sysTemplate.domain.FieldInfo;
import com.jeeplus.test.sysTemplate.domain.SysTemplateInfo;
import com.jeeplus.test.sysTemplate.domain.SysTemplateTreeNode;
import com.jeeplus.test.sysTemplate.mapper.SysTemplateMapper;
import com.jeeplus.test.sysTemplate.service.SysTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class SysTemplateServiceImpl implements SysTemplateService{

    @Autowired
    private SysTemplateMapper sysTemplateMapper;

    @Autowired
    private JlnuXlsxManageMapper jlnuXlsxManageDao;

    @Autowired
    private OfficeWrapper officeWrapper;

    @Autowired
    private OfficeService officeService;

    @Override
    public Page<SysTemplateInfo> getSysTemplateInfoPage(SysTemplateInfo sysTemplateInfo, Page<SysTemplateInfo> page) {
        Page<SysTemplateInfo> sysTemplateInfoPage = sysTemplateMapper.getSysTemplateInfoPage(sysTemplateInfo, page);
        return sysTemplateInfoPage;
    }

    @Override
    public boolean saveTemplateInfo(SysTemplateInfo templateInfo) {
        String templateName = "";
        OfficeDTO officeDTO = officeWrapper.toDTO ( officeService.getById ( templateInfo.getOfficeId() ) );
        if(officeDTO != null){
            templateName = officeDTO.getName() + "-" + templateInfo.getTemplateName();
            templateInfo.setTemplateName(templateName);
        }
        SysTemplateInfo sysTemplateInfo = sysTemplateMapper.getByName(templateName);
        if(sysTemplateInfo != null){
            return false;
        }
        return sysTemplateMapper.saveTemplateInfo(templateInfo);
    }

    @Override
    public boolean updateTemplateInfo(SysTemplateInfo templateInfo) {
        List<SysTemplateInfo> sysTemplateInfo = sysTemplateMapper.getByNameList(templateInfo.getTemplateName());
        if(sysTemplateInfo.size() > 1){
            return false;
        }
        return sysTemplateMapper.updateTemplateInfo(templateInfo);
    }

    @Override
    public boolean deleteTemplateInfo(String id) {
        return sysTemplateMapper.deleteTemplateInfo(id);
    }

    @Override
    public SysTemplateInfo getTemplateInfoById(String id) {
        return sysTemplateMapper.getTemplateInfoById(id);
    }

    @Override
    public List<FieldInfo> queryObjectById(Integer id) {
        JlnuXlsxManage xlsxManage = jlnuXlsxManageDao.queryById(id);
        if (xlsxManage == null) {
            return null;
        }
        String json =  xlsxManage.getContent();
        List<FieldInfo> fieldInfoList = JSON.parseObject(json,
                new TypeReference<List<FieldInfo>>() {});
        return fieldInfoList;
    }

    @Override
    public List<SysTemplateTreeNode> getSysTemplateInfoTreeData(SysTemplateInfo sysTemplateInfo) {

        List<SysTemplateInfo> sysTemplateInfoList = sysTemplateMapper.getSysTemplateInfoTreeData(sysTemplateInfo);

        // 创建所有节点的映射
        Map<String, SysTemplateTreeNode> nodeMap = new HashMap<>();

        // 第一遍遍历：创建所有节点
        for (SysTemplateInfo info : sysTemplateInfoList) {
            nodeMap.put(info.getId() + "", new SysTemplateTreeNode(info));
        }

        // 第二遍遍历：构建父子关系
        List<SysTemplateTreeNode> rootNodes = new ArrayList<>();
        for (SysTemplateInfo info : sysTemplateInfoList) {
            SysTemplateTreeNode currentNode = nodeMap.get(info.getId() + "");
            String father = info.getFather();
            String hierar = info.getHierar();
            if(hierar == null){
                hierar = "1";
            }
            if (father == null || father.isEmpty() || hierar.equals("1")) {
                // 没有父节点或父节点为0，是根节点
                rootNodes.add(currentNode);

            } else {
                // 添加到父节点的children列表
                SysTemplateTreeNode parentNode = nodeMap.get(father);
                if (parentNode != null) {
                    parentNode.getChildren().add(currentNode);
                }
            }
        }

        return rootNodes;
    }


}
